#endif
}
-static void init_domain_vhpt(struct vcpu *v)
+static int init_domain_vhpt(struct vcpu *v)
{
struct page_info *page;
void * vbase;
page = alloc_domheap_pages (NULL, VCPU_VHPT_ORDER, 0);
if ( page == NULL ) {
- panic_domain(vcpu_regs(v),"No enough contiguous memory for init_domain_vhpt\n");
+ printk("No enough contiguous memory for init_domain_vhpt\n");
+
+ return -1;
}
vbase = page_to_virt(page);
memset(vbase, 0, VCPU_VHPT_SIZE);
VHPT(v,cch_sz) = VCPU_VHPT_SIZE - VHPT(v,hash_sz);
thash_init(&(v->arch.vhpt),VCPU_VHPT_SHIFT-1);
v->arch.arch_vmx.mpta = v->arch.vhpt.pta.val;
+
+ return 0;
}
+static void free_domain_vhpt(struct vcpu *v)
+{
+ struct page_info *page;
-void init_domain_tlb(struct vcpu *v)
+ if (v->arch.vhpt.hash) {
+ page = virt_to_page(v->arch.vhpt.hash);
+ free_domheap_pages(page, VCPU_VHPT_ORDER);
+ }
+
+ return;
+}
+
+int init_domain_tlb(struct vcpu *v)
{
struct page_info *page;
void * vbase;
- init_domain_vhpt(v);
+
+ if (init_domain_vhpt(v) != 0)
+ return -1;
+
page = alloc_domheap_pages (NULL, VCPU_VTLB_ORDER, 0);
if ( page == NULL ) {
- panic_domain(vcpu_regs(v),"No enough contiguous memory for init_domain_tlb\n");
+ printk("No enough contiguous memory for init_domain_tlb\n");
+ free_domain_vhpt(v);
+ return -1;
}
vbase = page_to_virt(page);
memset(vbase, 0, VCPU_VTLB_SIZE);
VTLB(v,cch_buf) = (void *)((u64)vbase + VTLB(v,hash_sz));
VTLB(v,cch_sz) = VCPU_VTLB_SIZE - VTLB(v,hash_sz);
thash_init(&(v->arch.vtlb),VCPU_VTLB_SHIFT-1);
+
+ return 0;
}
+
void free_domain_tlb(struct vcpu *v)
{
struct page_info *page;
page = virt_to_page(v->arch.vtlb.hash);
free_domheap_pages(page, VCPU_VTLB_ORDER);
}
- if ( v->arch.vhpt.hash) {
- page = virt_to_page(v->arch.vhpt.hash);
- free_domheap_pages(page, VCPU_VHPT_ORDER);
- }
+
+ free_domain_vhpt(v);
}
/*
* Initialize VMX envirenment for guest. Only the 1st vp/vcpu
* is registered here.
*/
-void
+int
vmx_final_setup_guest(struct vcpu *v)
{
vpd_t *vpd;
* to this solution. Maybe it can be deferred until we know created
* one as vmx domain */
#ifndef HASH_VHPT
- init_domain_tlb(v);
+ if (init_domain_tlb(v) != 0)
+ return -1;
#endif
vmx_create_event_channels(v);
/* Set up guest 's indicator for VTi domain*/
set_bit(ARCH_VMX_DOMAIN, &v->arch.arch_vmx.flags);
+
+ return 0;
}
void
extern void purge_machine_tc_by_domid(domid_t domid);
extern void machine_tlb_insert(struct vcpu *d, thash_data_t *tlb);
extern ia64_rr vmmu_get_rr(struct vcpu *vcpu, u64 va);
-extern void init_domain_tlb(struct vcpu *d);
+extern int init_domain_tlb(struct vcpu *d);
extern void free_domain_tlb(struct vcpu *v);
extern thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag);
extern thash_data_t * vhpt_lookup(u64 va);
extern void identify_vmx_feature(void);
extern unsigned int vmx_enabled;
extern void vmx_init_env(void);
-extern void vmx_final_setup_guest(struct vcpu *v);
+extern int vmx_final_setup_guest(struct vcpu *v);
extern void vmx_save_state(struct vcpu *v);
extern void vmx_load_state(struct vcpu *v);
extern void vmx_setup_platform(struct domain *d);